/**
 * 游戏下载历史管理器
 */

class GameDownloadHistory {
  
  /**
   * 获取下载历史列表
   * @returns {Array} 下载历史数组
   */
  static getDownloadHistory() {
    try {
      const history = uni.getStorageSync('gameDownloadHistory') || []
      return history
    } catch (error) {
      console.log('获取下载历史失败:', error)
      return []
    }
  }
  
  /**
   * 添加下载记录
   * @param {Object} game 游戏对象
   * @param {string} filePath 文件路径
   * @param {string} gameType 游戏类型
   */
  static addDownloadRecord(game, filePath, gameType) {
    try {
      const history = this.getDownloadHistory()
      const gameName = this.getGameName(game)
      
      const record = {
        id: Date.now().toString(),
        gameName: gameName,
        gameType: gameType,
        filePath: filePath,
        downloadTime: new Date().toISOString(),
        size: game.size || 'Unknown',
        status: 'completed'
      }
      
      // 检查是否已存在相同游戏
      const existingIndex = history.findIndex(item => 
        item.gameName === gameName && item.gameType === gameType
      )
      
      if (existingIndex > -1) {
        // 更新已存在的记录
        history[existingIndex] = record
      } else {
        // 添加新记录到开头
        history.unshift(record)
      }
      
      // 限制历史记录数量（最多保留100条）
      if (history.length > 100) {
        history.splice(100)
      }
      
      uni.setStorageSync('gameDownloadHistory', history)
      console.log('下载记录已保存:', record)
      
    } catch (error) {
      console.log('保存下载记录失败:', error)
    }
  }
  
  /**
   * 删除下载记录
   * @param {string} recordId 记录ID
   */
  static removeDownloadRecord(recordId) {
    try {
      const history = this.getDownloadHistory()
      const filteredHistory = history.filter(item => item.id !== recordId)
      uni.setStorageSync('gameDownloadHistory', filteredHistory)
      return true
    } catch (error) {
      console.log('删除下载记录失败:', error)
      return false
    }
  }
  
  /**
   * 清空下载历史
   */
  static clearDownloadHistory() {
    try {
      uni.removeStorageSync('gameDownloadHistory')
      return true
    } catch (error) {
      console.log('清空下载历史失败:', error)
      return false
    }
  }
  
  /**
   * 根据游戏类型获取下载历史
   * @param {string} gameType 游戏类型
   * @returns {Array} 指定类型的下载历史
   */
  static getDownloadHistoryByType(gameType) {
    const history = this.getDownloadHistory()
    return history.filter(item => item.gameType === gameType)
  }
  
  /**
   * 获取游戏名称
   * @param {Object} game 游戏对象
   * @returns {string} 游戏名称
   */
  static getGameName(game) {
    if (game.name && game.name.trim() !== '') {
      return game.name
    }
    
    if (game.id) {
      return `游戏 #${game.id}`
    }
    
    try {
      const url = game.publicUrl || game.lanUrl
      if (url) {
        const urlObj = new URL(url)
        const pathParts = urlObj.pathname.split('/')
        const filename = pathParts[pathParts.length - 1]
        if (filename && filename !== '') {
          const nameWithoutExt = filename.split('.')[0]
          return nameWithoutExt || '未知游戏'
        }
      }
    } catch (e) {
      console.log('无法从 URL 提取游戏名称')
    }
    
    return '未知游戏'
  }
  
  /**
   * 检查文件是否存在
   * @param {string} filePath 文件路径
   * @param {Function} callback 回调函数
   */
  static checkFileExists(filePath, callback) {
    // #ifdef APP-PLUS
    plus.io.resolveLocalFileSystemURL(filePath, (fileEntry) => {
      callback(true, fileEntry)
    }, (error) => {
      callback(false, null)
    })
    // #endif
    
    // #ifndef APP-PLUS
    callback(false, null)
    // #endif
  }
  
  /**
   * 获取文件大小
   * @param {string} filePath 文件路径
   * @param {Function} callback 回调函数
   */
  static getFileSize(filePath, callback) {
    // #ifdef APP-PLUS
    plus.io.resolveLocalFileSystemURL(filePath, (fileEntry) => {
      fileEntry.file((file) => {
        callback(file.size)
      }, (error) => {
        callback(0)
      })
    }, (error) => {
      callback(0)
    })
    // #endif
    
    // #ifndef APP-PLUS
    callback(0)
    // #endif
  }
  
  /**
   * 格式化文件大小
   * @param {number} bytes 字节数
   * @returns {string} 格式化后的大小
   */
  static formatFileSize(bytes) {
    if (bytes === 0) return '0 B'
    const k = 1024
    const sizes = ['B', 'KB', 'MB', 'GB']
    const i = Math.floor(Math.log(bytes) / Math.log(k))
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
  }
  
  /**
   * 显示下载历史页面
   */
  static showDownloadHistory() {
    const history = this.getDownloadHistory()
    
    if (history.length === 0) {
      uni.showToast({
        title: '暂无下载历史',
        icon: 'none'
      })
      return
    }
    
    // 构建历史记录显示内容
    const historyList = history.slice(0, 10).map((record, index) => {
      const date = new Date(record.downloadTime).toLocaleDateString()
      return `${index + 1}. ${record.gameName} (${record.gameType.toUpperCase()}) - ${date}`
    })
    
    uni.showActionSheet({
      title: `下载历史 (共${history.length}条记录)`,
      itemList: [...historyList, '查看更多', '清空历史'],
      success: (res) => {
        if (res.tapIndex < historyList.length) {
          // 选择了具体的历史记录
          const selectedRecord = history[res.tapIndex]
          this.showRecordDetail(selectedRecord)
        } else if (res.tapIndex === historyList.length) {
          // 查看更多
          this.showFullHistory()
        } else if (res.tapIndex === historyList.length + 1) {
          // 清空历史
          this.confirmClearHistory()
        }
      }
    })
  }
  
  /**
   * 显示记录详情
   * @param {Object} record 下载记录
   */
  static showRecordDetail(record) {
    const date = new Date(record.downloadTime).toLocaleString()
    
    uni.showModal({
      title: record.gameName,
      content: `类型：${record.gameType.toUpperCase()}\n下载时间：${date}\n文件大小：${record.size}\n状态：已完成`,
      confirmText: '打开文件',
      cancelText: '关闭',
      success: (res) => {
        if (res.confirm && record.filePath) {
          this.openDownloadedFile(record)
        }
      }
    })
  }
  
  /**
   * 打开已下载的文件
   * @param {Object} record 下载记录
   */
  static openDownloadedFile(record) {
    this.checkFileExists(record.filePath, (exists) => {
      if (exists) {
        // #ifdef APP-PLUS
        uni.openDocument({
          filePath: record.filePath,
          success: () => {
            console.log('打开文件成功')
          },
          fail: (error) => {
            console.log('打开文件失败:', error)
            uni.showToast({
              title: '无法打开文件',
              icon: 'error'
            })
          }
        })
        // #endif
      } else {
        uni.showToast({
          title: '文件不存在或已被删除',
          icon: 'error'
        })
      }
    })
  }
  
  /**
   * 显示完整历史
   */
  static showFullHistory() {
    // 这里可以导航到一个专门的历史页面
    // 或者使用分页显示更多记录
    uni.showToast({
      title: '功能开发中',
      icon: 'none'
    })
  }
  
  /**
   * 确认清空历史
   */
  static confirmClearHistory() {
    uni.showModal({
      title: '确认清空',
      content: '确定要清空所有下载历史吗？此操作不可撤销。',
      success: (res) => {
        if (res.confirm) {
          if (this.clearDownloadHistory()) {
            uni.showToast({
              title: '历史记录已清空',
              icon: 'success'
            })
          } else {
            uni.showToast({
              title: '清空失败',
              icon: 'error'
            })
          }
        }
      }
    })
  }
}

export default GameDownloadHistory